home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Spanish Scene 1
/
SpanishScene1.iso
/
spanish pack n°1 by llfb
/
revistas
/
fanzine
/
fanzine01.dms
/
fanzine01.adf
/
41
< prev
next >
Wrap
Text File
|
1990-12-11
|
17KB
|
501 lines
/\
/ \
/¯¯¯¯\
/\/______\/\
/ \__/\__/ \
< A T R A C C I O N F R A C T A L >
CAPITULO I: SISTEMAS DE LINDENMAYER
(c) Warlord. Marzo 1992
Dedicado a Benoit Mandelbrot
Profesor de Matemáticas de la Universidad de Hardvard
(Por ser el primero en esto)
IMPORTANTE: Antes de leer este artículo, lee el de introducción a los frac-
tales, así te enterarás de qué son o para qué sirven.
Si hace unos meses, alguien hubiese escrito un curso sobre este tema, estar
seguros que me habría dado, cuanto menos, con un canto entre los dientes, y
la explicación es fácil: Este curso es único en su género. Hacer un curso
sobre un lenguaje u otra cosa, es más o menos adsequible, pues se puede
encontrar documentación sobre el tema y un esquema claro que seguir. Pero en
el caso de los fractales, esto no ocurre. Nunca he escuchado que una revista
o publicación, incluso entre las más serias, haga siquiera un artículo sobre
cómo construir fractales, a lo más, comentar algún programa de paisajes o
cosas por el estilo.
Espero que comprendáis, lo difícil que es esto. Uno no sabe por dónde
empezar,o de que hablar. Al final me he decidido por empezar por lo más fácil
De todos modos, si alguien necesitara algo más complejo, o queréis hacer
alguna pregunta, ya sabéis: Apdo 232, San Fernando 11100, Cádiz.
Quiero advertiros, que soy un simple aficcionado al tema, y ni mucho menos
soy un experto, pues entre otras cosas, estoy aprendiendo ahora. Si alguno de
los que lean esto, conocen algo sobre fractales, espero que me escriban
inmediatamente, ¡ya!, ¡¡ya!!.
* Libros DIVULGATIVOS (sólo superficiales) de fractales,publicados en España:
- Caos, por David o Zelnick. Editorial ???. Precio: Unas 2500 pts
- El mundo fractal. B. Mandelbrot, Ed. Tusquetes. Precio: Unas 1500 pts.
- Varios más que no recuerdo...
Si queréis comprar alguno, quizás el segundo sea mejor. Pero no olvides que
sólo son superficiales.
* Libros SERIOS de fractales, publicados en Español:
NINGUNO
* Libros SERIOS en Inglés que puedes buscar en España:
Con algo de suerte, no es difícil encontrar el libro:
FRACTAL PROGRAMING IN C
así como su edición avanzada. Con mucha suerte, y sólo en grandes librerias,
podréis encontrar alguno más.
La única forma de comprar algún otro, es escribir directamente a alguna
editorial. Concretamente, la Springer-Verlag dispone de excelentes libros
sobre esto. Su dirección es:
Springer - Verlag N.Y.
175 Fifth Avenue
New York, NY 10010
U.S.A.
El precio de estos libros varía entre 7000 y 15.000 pts
También la editorial Academic Press tiene muy buenos libros, aunque de un
nivel muy elevado. Para aquellos con buenos conocimientos de Matemáticas
(entiéndase de Topología y funciones complejas, el mejor es " Fractals
everywhere", de esta última editorial.
Por último os advertiré que al final de cada artículo incluire algunas
nociones de matemáticas fundamentales para este cursillo. Intentaré ir
incluyendo las rutinas en C, de forma que sean rutinas fáciles de
entender y de adaptar, ya sea a ensamblador o a un lenguaje de alto nivel.
Y sin más preámbulos .... ¡Ahí ván!...
SISTEMAS DE LINDENMAYER (L- SYSTEMS):
====================================
Fueron desarrollados por Aristid Lindermayer, para la representación de
la estructura de las plantas. Bajo el nombre de L-sistemas, se esconden
numerosas representaciones de los fractales, más o menos complejas.
Comenzaremos con el más importante, y a partir del cual se derivan los
demás
SISTEMAS DOL:
------------
(Sistemas OL-Determinísticos)
¡Atención!, ESTO es un fractal:
#define d 13
#define e 3
#define m 2
#define n 3
#define u 1
#define v 1
w : S(0)a(1,0)
p1 : a(t,c):t<m ----->a(t+1,c)
p2 : a(t,c):(t=m)&(c<e) ----->I(0,u)[L]a(1,c+1)
p3 : a(t,c):(t=m)&(c=e) ----->I(0,u)[L][b(1)]a(1,c)
p4 : b(t) :t<n ----->b(t+1)
p5 : b(t) :t=n ----->I(0,v)[L]b(1)
p6 : S(t) :* ----->S(t+1)
p7 : S(t) < I(i,j):t=d ----->I(i,j)
p8 : I(i,j):(0<i)&(i<j) ----->I(i+1,j)
p9 : I(i,j)<I(k,l):(i=j)&(k=0) ----->I(1,l)
p10: I(i,j)<a(k,l):i>0 ----->I[L][b(1)]B
p11: I(i,j)<b(k) :i>0 ----->I[L]B
p12: B :* ----->I[K]B
END.
¡¡ Un momento!!, ¡que nó cunda el pánico! .... ¡volved!. Esto no es necesa-
rio que lo comprendáis (¡aún!), pero... ¿a que a sido un buen pegote?
Para los "viejos carrozas informáticos", en cuanto os diga de qué va esto,
enseguida recordaréis un lenguaje, tan querido como olvidadado : ¡EL LOGO!.
¡Un momento!, ¡esto no significa que haya que saber Logo o que vaya a hacer
otro de mis cursos-rollos! (pero no creáis que no me gustaría ... Je,je,je).
El Logo es ya un lenguaje que pasó a la historia hace ya muchos años, y que
hoy en día no tiene ninguna utilidad.
Ahora, para comenzar de una forma bonita y divertida, dibujemos un fractal.
Es el llamado "snowflake" de Von Koch (1905)
ATENCION:
- Un fractal comienza siempre con una semilla o iniciador, denotada por w.
- A continuación, van una serie de pasos, denotados por p1, p2.... Se
aplican uno detrás de otro. Una vez acabados, le fractal ha sido dibujado.
- Si el paso, es siempre el mismo, se denota por "p" y se llama "generador".
La orden dada por el paso "p" se aplica un cierto número de veces (los
que uno quiera). Generalmente 4 ó 5. Teóricamente se pueden aplicar
infinitas veces, en la práctica, como por ejemplo, a la hora de hacer una
demo, la limitada resolución de nuestra pantalla no nos permite mucho más
allà de 3 pasos o iteraciones.
- a-->b significa que donde halla "a", quitarla y poner "b"
Snowflake de Van Koch:
w : Cuadrado
p : linea -------> linea+triangulo+linea (ed, sustituir línea por figura p)
w: Dibujamos un cuadrado
_________________
w= | |
| | p= /\
| | ________/ \________
| |
| |
| |
|_________________|
INICIADOR GENERADOR
En el primer paso, sustituimos las cuatro lineas rectas del cuadrado por p.
Obtenemos:
/\
_____/ \______
| | No está muy bien dibujado, pero si lo pintais
| | bien, podréis verlo mucho mejor.Obtenemos una
/ \ especie de estrella con 16 líneas rectas (con-
/ \ tar todas las líneas,4 por lado:
\ / 1 2/\3
\ / _________/ \_______4
| |
|_____ ______|
\ /
\/
En cada una de estas 16 líneas metemos la figura p de nuevo. Si lo hacéis 4
o más veces, obtendréis un maravilloso fractal.
Si habéis leido el artículo de introducción os preguntaréis, ¿y que pasa con
el rollo de la dimensión fraccional?. Sabed, que si esto se hace un número
infinito de veces, las figuras "cambian de dimensión" (mas o menos).
Otro ejemplo menos geométrico:
w: a
p: a ----> ab
Resultado:
a paso 0: escibimos la semilla w
ab paso 1: sustituimos "a" por ab
abb paso 2: "" "" "" ""
abbb etc....
abbbb
(etc...)
Una vieja amiga: La tortuga
---------------------------
Para los que no lo sepan, la tortuga era un triángulo que desplazábamos
por la pantalla en el lenguaje Logo, para dibujar. Se guiaba con órdenes
del siguiente tipo:
adelante y dibuja 10 (la "tortuga" se movia 10 pixels para delante, dibujan
do una línea)
girar derecha 90 (la tortuga giraba 90 grados a la derecha)
atrás y no dibujar 3 (se mueve hacia atrás 3 pixels pero no dibuja nada)
etc...
la tortuga, venía pues definida por 3 variables: (x,y,a).
x = Posición horizontal en pantalla.
y = Posición vertical en pantalla.
a = ángulo de la nariz de la tortuga.
De ahora en adelante, utilizaremos una tortuga (eso sí, muy rápida)....
bueno, utilizaremos una Turbo-tortuga para que dibuje nuestros fractales.
Los comandos básicos (por el momento), serán:
F : Mover adelante d posiciones y dibujar una línea. Ahora, la nueva posición
de la tortuga es:
x' = x+d*cos(a)
y' = y+d*sen(a)
el ángulo no varía
f : Igual que la anterior, pero sin dibujar línea.
+ : Girar un ángulo "s" a la izqda de a grados. La posición no varía pero el
ángulo sí:
a' = a+s
- : Igual pero a la izqda: a' = a-s
Nota: los valores de "d" y "s" se definen al principio del programa.
Veamos otro Fractal:
w: F - F - F - F -
p: F ----> F - F + F + F F - F - F + F
el paso será d=1 y el ángulo s=90 grados.
¿Qué es w?:
En principio, suponemos que la nariz de la tortuga apunta hacia arriba.
w: Mover 1 adelante.Girar izqda 90 grados. Pintar linea.Girar otra vez.
Pintar línea,girar pintar y girar...... ¡un cuadrado!:
Tortuga en el paso 0: /\
F ...... /|\
|
| .... posición anterior
- ...... >
|
|
|
F ..... ----->
|
|
|
etc....
Para ver lo que es p, lo mejor es pintarlo en una gran hoja de papel. Recor-
dad que ahora debéis sustituir los 4 lados del cuadrado por p. El resultado
es el llamado "isla cuadrática de Koch". Este fractal ha sido utilizado en
varias demos, como por ejemplo "Alpha-Omega" de los PMC (¡Hey Vanguard!, no
estaba nada mal!)
Otro ejemplo:
d=1, s=90 grados. Aplicar p 4 veces
w: - F
p: F --> F + F - F - F + F
Ya que estamos con las demos, y para acabar con esta parte, el siguiente
fractal es otro de los más utilizados en dichas demos:
# define s=90 /*ie, el ángulo vale 90 grados*/
# define p=1 /* el paso vale 1
# define n=4 /* de ahora en adelante, n será el número de veces que hay
que repetir p */
w: F - F - F - F
p: F ---> F F - F - - F - F
Nota: Estos Fractales son los más sencillos que uno puede encontrar. No
esperéis que resulten tan espectaculares como por ejemplo el conocido plasma
de la Hardwired. Estos Fractales son mucho más complejos y serán explicados
bastante más adelante.
Sistemas DOL: Edge & node rewriting
-----------------------------------
Siguiendo con los sistemas DOL, vamos a ver otras maneras de crear fractales
muy similar a la anterior. Son los sistemas Node rewriting & Edge rewriting.
Me he permitido la libertad de dejar sus denominaciones en Inglés, pues no
hay una palabra en Español que los defina bien. Su traducción viene a ser
algo así como Reescritura de ejes (Edge) y vértices (Nodes).
Como decía, es muy parecido al anterior, sólo que en esta ocasión podemos
controlar más o menos (mas bien menos), el movimiento del fractal.
Edge Rewriting:
Dan lugar a las curvas FASS (su traducción es irrelevante). La misión de
estas curvas, es rellenar lo más posible todo el espacio, pero sin cruzarse.
Es igual a las anteriores, sólo que en esta ocasión el movimiento hacia de-
lante de la tortuga, se ha diferenciado en dos. Es decir, ahora en lugar de
"F", encontrarás "Fr" y "Fl" (del Inglés Forward-Right & Forward-Left). ¡Pero
ojo!, NO SON DISTINTOS. SON EL MISMO MOVIMIENTO ....
... y se preguntarán... si son el mismo, ¿porqué llamarles de forma
distinta?.
Veamos. Supongamos que tenemos una línea formada por 4 movimientos hacia
delante de la tortuga:
1 2 3 4
F F F F .... --------->---------->----------->---------->
Antes hacíamos por ejemplo:
w: F F F F
p: F----> F + F -
El problema, es que hemos modificado cada F de la línea iniciadora (w)
por otro movimiento, que ha actuado POR IGUAL sobre las cuatro partes de
la línea. ¿Qué ocurre si sólo deseamos que actúe sobre las dos primeras
partes?, o mejor, ¿y si queremos que sobre 1 y 3 actúe de forma contraria
a la que actúa sobre 2 y 4?.
A la hora de rellenar espacios vacíos con las curvas FASS, es importante
rellenar espacios a derecha e izqda de la línea iniciadora. Veamos un ejem-
plo:
#define p=1
#define s=60 /* 60 grados*/
#define n=4 /* repetimos 4 veces el proceso */
w : Fl
p : Fl ---> Fl+Fr++Fr-Fl--FlFl-Fr+
Fr ---> -Fl+FrFr++Fr+Fl--Fl-Fr
(Curva Hexagonal de Gosper)
¿Cómo actúa este Fractal?
w: Dibujamos una línea hacia delante. Al denotarla por Fl significará
que el fractal que la sustituya debe moverse hacia si izqda:
izqda de la linea
--------------------------
derecha de la línea
p: Sustituimos esta línea por otra, que si la representáis veréis que
en efecto, se mueve hacia su izqda. Posteriormente, todas las líneas
que aparecen como Fr las sustituimos por un nuevo dibujo, que se
mueve hacia la derecha, y así sucesivamente ...
¿Cómo?, ¿que no os habéis enterado?. Vale, repetimos:
Dibujamos una línea que llamaremos (Fl). A partir de ahora, donde aparezca
Fl, sustituiremos el primer mogollón, y donde aparezca Fr, el segundo.
¿cómo que donde aparece Fr?, aparecerá al sustituir Fl por Fl+Fr++Fr... la
primera vez. Espero que ya esté más claro ...
Desde luego, para moverse hacia la izqda o la derecha, podemos construir
cientos de dibujos, más o menos complicados.
Para acabar, éste es un ejemplo de movimiento a la izqda:
Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
+Fl-Fl-FrFr+
Así, si hacemos:
w: Fl
p: Fl ---> FlFl+Fr+Fr-Fl-Fl+Fr+FrFl-Fr-FlFlFr+Fl-Fr-FlFl-Fr+FlFr+Fr
+Fl-Fl-FrFr+
Fr ---> bla, bla...
En la primera iteración, al sustituir Fl, obtendremos:
----
| |
| |
---- ---- ----
| |
| |
---- ---- ----
| |
| |
---- ---- Izqda de la línea
| | | | iniciadora
| | | |
---- ----
| |
| |
Linea ---- ----
original
derecha de la línea iniciadora (Por aquí estaría un fractal de
la forma Fr)
SEGUIREMOS INFORMANDO ...
¿Os ha gustado?, ¡Espero que sí!. Si os gusta, pero no lo acabáis de
entender, escribirme, intentaré responder a todos.
Veamos algo ahora de matamáticas ...
NUMEROS COMPLEJOS:
-----------------
Son muy utilizados en el diseño de fractales. Explicar de dónde salen y cómo
són, me parece algo aburrido, así que iré directamente al grano:
Supongamos que tenemos dos puntos en la pantalla de nuestro querido Amiga,
que tienen por coordenadas (a,b) y (c,d). ¿Cómo operar con ellos?, ¿cómo
multiplicarlos....?. Necesitamos otra representación y esta viene a través
de los números complejos.
Así pues, un punto de coordenadas (x,y) lo representaremos por x + yi.
x = PARTE REAL
y = PARTE IMAGINARIA
Podemos ahora operar con ellos:
SUMA:
(x + yi) + (a + bi) = (x+a + (y+b)i )
RESTA:
igual pero todo con menos
MULTIPLICACION:
(a+bi)*(c+di) = (a*c - b*d)+(b*c + a*d)i
La división no es necesaria para nuestros fines.
En C sería ...
struct complex
{
float real,
imaginario;
}
....
/* Veamos como multiplicar dos números complejos*/
struct complex multiplicar(struct complex a,struct complex b)
{
struct complex c;
c.real=a.real*b.real-a.imaginario*b.imaginario;
c.imaginario=a.imaginario*b.real+a.real*b.imaginario;
return c;
}
----------------------------------------------------------------------------
Y EN NUESTRO PROXIMO NUMERO ...
* más sobre Sistemas DOL:Node rewriting
* Fractales ¡TRIDIMENSIONALES!
* Estructuras en árbol
* Operaciones con matrices
TODO ESTO Y MUCHO MAS, EN FANZINE NUMERO 2.